function HTMLParser(e, t) {
	function r(e, r, n, s) {
		if (r = r.toLowerCase(), block[r])
			for (; l.last() && inline[l.last()];) a("", l.last());
		if (closeSelf[r] && l.last() == r && a("", r), s = empty[r] || !!s, s || l.push(r), t.start) {
			var i = [];
			n.replace(attr, function(e, t) {
				var r = arguments[2] ? arguments[2] : arguments[3] ? arguments[3] : arguments[4] ? arguments[
					4] : fillAttrs[t] ? t : "";
				i.push({
					name: t,
					value: r,
					escaped: r.replace(/(^|[^\\])"/g, '$1\\"')
				})
			}), t.start && t.start(r, i, s)
		}
	}

	function a(e, r) {
		if (r)
			for (var a = l.length - 1; a >= 0 && l[a] != r; a--);
		else var a = 0;
		if (a >= 0) {
			for (var n = l.length - 1; n >= a; n--) t.end && t.end(l[n]);
			l.length = a
		}
	}
	var n, s, i, l = [],
		c = e;
	for (l.last = function() {
			return this[this.length - 1]
		}; e;) {
		if (s = !0, l.last() && special[l.last()]) e = e.replace(new RegExp("([\\s\\S]*?)</" + l.last() + "[^>]*>"),
			function(e, r) {
				return r = r.replace(/<!--([\s\S]*?)-->|<!\[CDATA\[([\s\S]*?)]]>/g, "$1$2"), t.chars && t.chars(r),
					""
			}), a("", l.last());
		else if (0 == e.indexOf("\x3c!--") ? (n = e.indexOf("--\x3e")) >= 0 && (t.comment && t.comment(e.substring(4,
				n)), e = e.substring(n + 3), s = !1) : 0 == e.indexOf("</") ? (i = e.match(endTag)) && (e = e.substring(
				i[0].length), i[0].replace(endTag, a), s = !1) : 0 == e.indexOf("<") && (i = e.match(startTag)) && (e =
				e.substring(i[0].length), i[0].replace(startTag, r), s = !1), s) {
			n = e.indexOf("<");
			var o = n < 0 ? e : e.substring(0, n);
			e = n < 0 ? "" : e.substring(n), t.chars && t.chars(o)
		}
		if (e == c) throw "Parse Error: " + e;
		c = e
	}
	a()
}

function makeMap(e) {
	for (var t = {}, r = e.split(","), a = 0; a < r.length; a++) t[r[a]] = !0;
	return t
}

function removeDOCTYPE(e) {
	return e.replace(/<\?xml.*\?>\n/, "").replace(/<!doctype.*>\n/, "").replace(/<!DOCTYPE.*>\n/, "")
}

function parseAttrs(e) {
	return e.reduce(function(e, t) {
		var r = t.value,
			a = t.name;
		return e[a] ? e[a] = e[a] + " " + r : e[a] = r, e
	}, {})
}

function parseHtml(e) {
	e = removeDOCTYPE(e);
	var t = [],
		r = {
			node: "root",
			children: []
		};
	return HTMLParser(e, {
		start: function(e, a, n) {
			var s = {
				name: e
			};
			if (0 !== a.length && (s.attrs = parseAttrs(a)), n) {
				var i = t[0] || r;
				i.children || (i.children = []), i.children.push(s)
			} else t.unshift(s)
		},
		end: function(e) {
			var a = t.shift();
			if (a.name !== e && console.error("invalid state: mismatch end tag"), 0 === t.length) r.children
				.push(a);
			else {
				var n = t[0];
				n.children || (n.children = []), n.children.push(a)
			}
		},
		chars: function(e) {
			var a = {
				type: "text",
				text: e
			};
			if (0 === t.length) r.children.push(a);
			else {
				var n = t[0];
				n.children || (n.children = []), n.children.push(a)
			}
		},
		comment: function(e) {
			var r = {
					node: "comment",
					text: e
				},
				a = t[0];
			a.children || (a.children = []), a.children.push(r)
		}
	}), r.children
}
Object.defineProperty(exports, "__esModule", {
	value: !0
});
var startTag =
	/^<([-A-Za-z0-9_]+)((?:\s+[a-zA-Z_:][-a-zA-Z0-9_:.]*(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)>/,
	endTag = /^<\/([-A-Za-z0-9_]+)[^>]*>/,
	attr = /([a-zA-Z_:][-a-zA-Z0-9_:.]*)(?:\s*=\s*(?:(?:"((?:\\.|[^"])*)")|(?:'((?:\\.|[^'])*)')|([^>\s]+)))?/g,
	empty = makeMap(
		"area,base,basefont,br,col,frame,hr,img,input,link,meta,param,embed,command,keygen,source,track,wbr"),
	block = makeMap(
		"a,address,article,applet,aside,audio,blockquote,button,canvas,center,dd,del,dir,div,dl,dt,fieldset,figcaption,figure,footer,form,frameset,h1,h2,h3,h4,h5,h6,header,hgroup,hr,iframe,isindex,li,map,menu,noframes,noscript,object,ol,output,p,pre,section,script,table,tbody,td,tfoot,th,thead,tr,ul,video"
		),
	inline = makeMap(
		"abbr,acronym,applet,b,basefont,bdo,big,br,button,cite,code,del,dfn,em,font,i,iframe,img,input,ins,kbd,label,map,object,q,s,samp,script,select,small,span,strike,strong,sub,sup,textarea,tt,u,var"
		),
	closeSelf = makeMap("colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr"),
	fillAttrs = makeMap(
		"checked,compact,declare,defer,disabled,ismap,multiple,nohref,noresize,noshade,nowrap,readonly,selected"),
	special = makeMap("script,style");
exports.default = parseHtml;